package com.pengshun.modules.api.user.service.impl;

import com.pengshun.modules.api.mapper.SystemMessageMapper;
import com.pengshun.modules.api.user.repository.SystemMessageCategoryRepository;
import com.pengshun.modules.api.user.repository.SystemMessageRepository;
import com.pengshun.modules.api.user.repository.SystemMessageUserRepository;
import com.pengshun.modules.api.user.service.SystemMessageService;
import com.pengshun.modules.api.user.service.dto.SystemMessageDto;
import com.pengshun.modules.api.user.service.mapstruct.SystemMessageTodo;
import com.pengshun.modules.common.BaseResult;
import com.pengshun.modules.domain.SystemMessage;
import com.pengshun.modules.domain.SystemMessageUser;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @author luoligang
 * @create 2021/3/12
 */
@Service
@RequiredArgsConstructor
public class SystemMessageServiceImpl implements SystemMessageService {

    private final SystemMessageRepository systemMessageRepository;
    private final SystemMessageUserRepository systemMessageUserRepository;

    private final SystemMessageTodo systemMessageTodo;

    private final SystemMessageMapper systemMessageMapper;

    @Override
    public BaseResult getMessageList(SystemMessageDto para) {
        List<SystemMessageDto> list=new ArrayList<>();
        if(para.getCategoryId()==1){
            //查询系统公告
            list=systemMessageMapper.getSystemMessage(para.getUserId(),para.getPage(),para.getSize());
            for (SystemMessageDto dto : list) {
                dto.setImRead(dto.getUserId()==null?0:1);
            }
        }else{
            list= systemMessageMapper.getMessageList(para.getPage(), para.getSize(), para.getUserId(), para.getCategoryId());
        }

        return new BaseResult(0, list);
    }

    @Override
    public BaseResult getMessageDetil(SystemMessageDto para) {
//        1、认证成功 失败 消息
//        2、关联车主 关联司机   待关联  成功  拒绝 消息
//        3、车辆审核成功 失败消息
//        4、商品订单下单 确认 拒绝   支付   消息提示（发布审核消息提示）
//        5、货运 发布  审核  通过 拒绝 消息提示
//        6、货源订单 分配  通过 拒绝 消息
//        7、司机用车老板车辆接单 消息
//        8、车老板给司机分配货运 消息
//        9、结算申请  通过  拒绝 消息
//        10、关注商户 运输公司 发布新货运 新商品 消息通知
//        11、违约消息通知
//        12、修改手机号  修改密码  修改支付密码 消息
//        13、资金变动 消息
        SystemMessage message = systemMessageRepository.findById(para.getSystemMessageId()).orElseGet(SystemMessage::new);
        SystemMessageDto dto=systemMessageTodo.toDto(message);
        return new BaseResult(0, dto);
    }

    @Override
    public BaseResult getMessageCategory(Long id) {
        List<SystemMessageDto> list = systemMessageMapper.getMessageCategoryList(id);
        if(list.size()>0){
            for (SystemMessageDto dto : list) {
                if(dto.getCategoryId()==1){
                    //系统公告查询数量
                    int  num=systemMessageMapper.getSystemMessageNotReadNum(id);
                    //查询系统公告最新一条
                    List<SystemMessageDto> systemMessageDtos=systemMessageMapper.getSystemMessage(id,0,1);
                    //设置系统消息未读数量
                    dto.setMessageNum(num);
                    if(systemMessageDtos.size()>0){
                        dto.setRemark(systemMessageDtos.get(0).getRemark());
                        dto.setTitle(systemMessageDtos.get(0).getTitle());
                        dto.setCreateTime(systemMessageDtos.get(0).getCreateTime());
                        dto.setImRead(systemMessageDtos.get(0).getUserId()==null?0:1);
                    }
                }
            }
        }



        return new BaseResult(0, list);
    }

    @Override
    public BaseResult updateMessageStatus(SystemMessageDto para) {
        if (para.getCategoryId() != null) {
            List<SystemMessageUser> users=new ArrayList<>();
            if(para.getCategoryId()==1){
                List<SystemMessageDto> list=systemMessageMapper.getNotReadSystemMessage(para.getUserId());
                //查询系统全部未读消息
                for (SystemMessageDto message : list) {
                    SystemMessageUser user=new SystemMessageUser(message.getSystemMessageId(),para.getUserId());
                    users.add(user);
                }
                systemMessageUserRepository.saveAll(users);
            }else{
                List<SystemMessage> list=systemMessageRepository.findByUserIdAndCategoryIdAndImRead(para.getUserId(),para.getCategoryId(),0);
                //正常消息设置已读
                for (SystemMessage message : list) {
                    message.setImRead(1);
                }
                systemMessageRepository.saveAll(list);
            }


        } else {
            SystemMessage message = systemMessageRepository.findById(para.getSystemMessageId()).orElseGet(SystemMessage::new);
            if(message.getCategoryId()==1){
                SystemMessageUser user=new SystemMessageUser(message.getSystemMessageId(),para.getUserId());
                SystemMessageUser users=systemMessageUserRepository.findByUserIdAndSystemMessageId(para.getUserId(),message.getSystemMessageId());
                if(users!=null){
                    systemMessageUserRepository.deleteBySystemMessageId(message.getSystemMessageId());
                }
                systemMessageUserRepository.save(user);
            }else{
                //更新状态为已读
                message.setImRead(1);
                systemMessageRepository.save(message);

            }

        }
        return new BaseResult(0);
    }

    @Override
    public int save(SystemMessageDto para) {
        systemMessageRepository.save(systemMessageTodo.toEntity(para));
        return 0;
    }

    @Override
    public BaseResult getNotReadMessageNum(Long id) {
        List<SystemMessage> list=systemMessageRepository.findByUserIdAndImRead(id,0);
        //查询系统未读数量
        int num=systemMessageMapper.getSystemMessageNotReadNum(id);
        for (int i = 0; i < num; i++) {
            SystemMessage message=new SystemMessage();
            list.add(message);
        }
        return new BaseResult(0,list);
    }
}
